#ifndef MUSIC_H
#define MUSIC_H

#include "commonpage.h"
#include "lyricspage.h"
#include "musiclist.h"
#include "qmediaplaylist.h"
#include "volumetool.h"
#include <QFileDialog>
#include <QGraphicsDropShadowEffect>
#include <QJsonArray>
#include <QLoggingCategory>
#include <QMouseEvent>
#include <QPropertyAnimation>
#include <QSqlDatabase>
#include <QWidget>

// 定义一个宏来获取相对路径文件名
#define __FILENAME__ (QFileInfo(__FILE__).fileName().toLocal8Bit().constData())
#define Debug qDebug() << "[" << __FILENAME__ << "]" << "[" << __LINE__ << "]" << " - "

QT_BEGIN_NAMESPACE

namespace Ui
{
    class Music;
}

QT_END_NAMESPACE

class Music final : public QWidget
{
    Q_OBJECT

public:
    // 构造函数，初始化音乐播放器主窗口
    explicit Music(QWidget *parent = nullptr);
    // 初始化用户界面组件
    void initUi();
    // 连接信号和槽函数
    void connectAndSlots();
    // 生成随机图片路径和文本的JSON数组
    static QJsonArray randomPiction();
    // 根据当前页面更新按钮动画状态
    void updateBtFromAnimal() const;
    // 析构函数，释放资源
    ~Music() override;

    // 初始化音乐播放器组件
    void initPlayer();
    // 初始化SQLite数据库
    void initSQLite();
    // 初始化音乐列表
    void initMusicList();

public slots:
    // 处理左侧导航按钮点击事件
    void on_btClicked(int pageId) const;
    // 音量按钮点击事件处理
    void on_volume_clicked() const;
    // 添加本地音乐按钮点击事件处理
    void on_addLocal_clicked();
    // 播放按钮点击事件处理
    void onPlayMusic();
    // 播放状态改变事件处理
    void onPlayStateChanged(QMediaPlayer::PlaybackState state);
    // 上一首按钮点击事件处理
    void onPlayUpClicked() const;
    // 下一首按钮点击事件处理
    void onPlayDownClicked() const;
    // 播放模式按钮点击事件处理
    void onPlaybackModeClicked() const;
    // 播放模式改变事件处理
    void onPlaybackModeChanged(QMediaPlaylist::PlaybackMode playback_mode) const;
    // 播放全部按钮点击事件处理
    void onPlayAll(pageType page_type);
    // 播放指定页面的所有音乐
    void playAllOfCommonPage(commonPage *page, int index);
    // 根据指定页面和索引播放音乐
    void playMusicByIndex(commonPage *page, int index);
    // 播放列表当前索引改变事件处理
    void onCurrentIndexChanged(int index);
    // 设置播放器音量
    void setPlayerVolume(int volume) const;
    // 音乐总时长改变事件处理
    void onDurationChanged(qint64 duration) const;
    // 音乐播放位置改变事件处理
    void onPositionChanged(qint64 position) const;
    // 音乐进度条位置改变事件处理
    void onMusicSliderChanged(float ration) const;
    // 歌词按钮点击事件处理
    void onLrcWordClicked() const;

private slots:
    // 退出按钮点击事件处理
    void on_quit_clicked();
    // 更新音乐的喜欢状态并刷新相关页面
    void updateLikeMusicAndPage(bool is_like, const QString &music_id);
    // 处理音乐元数据
    void handleMetaData();
    // 皮肤按钮点击事件处理
    void on_skin_clicked();
    // 最大化按钮点击事件处理
    void on_max_clicked();
    // 最小化按钮点击事件处理
    void on_min_clicked();

protected:
    // 鼠标按下事件处理，用于窗口拖动
    void mousePressEvent(QMouseEvent *event) override;
    // 鼠标移动事件处理
    void mouseMoveEvent(QMouseEvent *event) override;
    // 鼠标释放事件处理
    void mouseReleaseEvent(QMouseEvent *event) override;

private:
    // UI界面指针
    Ui::Music *ui;
    // 窗口拖动标志
    bool dragging = false;
    // 窗口拖动位置偏移
    QPoint dragPosition = QPoint();
    // 音量工具窗口指针
    volumeTool *volume_tool_ = nullptr;
    // 音乐列表对象
    musicList music_list_ = musicList();
    // 媒体播放器指针
    QMediaPlayer *player_ = nullptr;
    // 媒体播放列表指针
    QMediaPlaylist *play_list_ = nullptr;
    // 当前页面指针
    commonPage *cur_page_ = nullptr;
    // 音乐总时长
    qint64 total_time_ = 0;
    // 当前播放索引
    int current_index_ = 0;
    // 歌词页面指针
    LyricsPage *lrc_page_ = nullptr;
    // 歌词页面动画指针
    QPropertyAnimation *lrc_animation_ = nullptr;
    // SQLite数据库对象
    QSqlDatabase sqlite_ = QSqlDatabase();
};
#endif // MUSIC_H